package org.practice.intercepter;


import org.apache.log4j.Logger;
import org.practice.action.BaseAction;
import org.practice.util.Constant;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
 * @author jack
 * 过滤器:在servlet容器启动时调用一次，以后对request,response过滤掉一些信息或者提前设置一些参数(比如过滤掉非法url,设置字符集编码等)，然后再执行 action，由链栈维护其回调过程。
 * 拦截器：是面向切面编程的运用，在执行Action时切入其它业务逻辑。 
 * 在action的生命周期中，拦截器可以多次被调用，而过滤器只能在容器初始化时被调用一次 ，执行顺序 ：过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
 * 拦截器与过滤器的区别 ：
 * 拦截器是基于java的反射机制的，是AOP编程的运用，而过滤器是基于函数回调。 
 * 拦截器不依赖与servlet容器，过滤器依赖与servlet容器。 
 * 拦截器只能对action请求起作用，而过滤器则可以对几乎所有的请求起作用（比如直接请求jsp，拦截器就不起作用）。 
 * 拦截器可以访问action上下文、值栈里的对象，而过滤器不能访问。 
 */
public class ExceptionInfoInterceptor implements Interceptor{
	private static final Logger log = Logger.getLogger(ExceptionInfoInterceptor.class);

    public void destroy() {

    }

    public void init() {

    }

    public String intercept(ActionInvocation invocation) throws Exception {
        try {
            return invocation.invoke();//执行action逻辑捕获到异常统一跳转到全局的result视图
        } catch (Exception e) {
            String message = "Caught exception while invoking action: " + invocation.getAction();
            log.error(message, e);
            BaseAction action = (BaseAction) invocation.getAction();
            action.addActionError(e.getMessage());
            return Constant.ACTION_EXCEPTION;
        }
    }
 
}